package cn.gengar.infrastructure.adapter.repository;

import cn.gengar.domain.tag.adapter.repository.ITagRepository;
import cn.gengar.domain.tag.model.entity.CrowdTagsJobEntity;
import cn.gengar.infrastructure.dao.ICrowdTagsDao;
import cn.gengar.infrastructure.dao.ICrowdTagsDetailDao;
import cn.gengar.infrastructure.dao.ICrowdTagsJobDao;
import cn.gengar.infrastructure.dao.po.CrowdTags;
import cn.gengar.infrastructure.dao.po.CrowdTagsDetail;
import cn.gengar.infrastructure.dao.po.CrowdTagsJob;
import cn.gengar.infrastructure.redis.IRedisService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.Objects;

@Repository
@Slf4j
public class TagRepository implements ITagRepository {

    @Resource
    private ICrowdTagsDao crowdTagsDao;
    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;
    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;

    @Resource
    private IRedisService redisService;

    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJob = crowdTagsJobDao.queryCrowdTagsJob(CrowdTagsJob.builder()
                .tagId(tagId)
                .batchId(batchId)
                .build());

        if (Objects.nonNull(crowdTagsJob)) {
            return CrowdTagsJobEntity.builder()
                    .tagType(crowdTagsJob.getTagType())
                    .tagRule(crowdTagsJob.getTagRule())
                    .statStartTime(crowdTagsJob.getStatStartTime())
                    .statEndTime(crowdTagsJob.getStatEndTime())
                    .build();
        }
        return null;
    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {
        try {
            crowdTagsDetailDao.addCrowdTagsUserId(CrowdTagsDetail.builder()
                    .tagId(tagId)
                    .userId(userId)
                    .build()
            );

            RBitSet bitSet = redisService.getBitSet(tagId);
            bitSet.set(redisService.getIndexFromUserId(userId));
        }catch (DuplicateKeyException ignore) {
            log.warn("重复添加 tagId:{}, userId:{}",tagId, userId);
        }

    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int count) {
        crowdTagsDao.updateCrowdTagsStatistics(CrowdTags.builder()
                .tagId(tagId)
                .statistics(count)
                .build());
    }
}
